package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.ClazzMapper;
import com.itheima.pojo.Clazz;
import com.itheima.pojo.Emp;
import com.itheima.pojo.PageResult;
import com.itheima.service.ClazzService;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {

    @Autowired
    private EmpService empService;

    /**
     * 新增班级
     *
     * @param clazz 班级信息
     */
    @Override
    public void saveClazz(Clazz clazz) {
        clazz.setUpdateTime(LocalDateTime.now());
        clazz.setCreateTime(LocalDateTime.now());
        this.save(clazz);
    }

    /**
     * 分页查询班级（含筛选、关联班主任、计算状态）
     *
     * @param name     班级名称（模糊筛选）
     * @param begin    筛选开始日期
     * @param end      筛选结束日期
     * @param page     页码
     * @param pageSize 每页记录数
     * @return 分页结果（含班级信息、班主任姓名、班级状态）
     */
    @Override
    public PageResult<Clazz> findPage(String name, LocalDate begin, LocalDate end, int page, int pageSize) {
        // 1. 创建分页对象，指定页码和每页条数
        IPage<Clazz> iPage = new Page<>(page, pageSize);

        // 2. 构建查询条件：姓名模糊查询 + 日期范围查询
        LambdaQueryWrapper<Clazz> wrapper = Wrappers.lambdaQuery();
        wrapper.like(name != null, Clazz::getName, name) // 姓名不为空时，模糊匹配班级名称
                .between(begin != null && end != null, Clazz::getCreateTime, begin, end); // 日期不为空时，匹配创建时间范围

        // 3. 执行分页查询，获取当前页数据和总记录数
        iPage = this.page(iPage, wrapper);
        List<Clazz> records = iPage.getRecords();
        long total = iPage.getTotal();

        // 4. 提取所有班级的班主任ID（去重，减少查询次数）
        List<Integer> masterIds = records.stream()
                .map(Clazz::getMasterId)
                .distinct()
                .toList();

        if (!CollectionUtils.isEmpty(masterIds)) {
            // 5. 批量查询班主任信息
            List<Emp> empList = empService.listByIds(masterIds);

            // 6. 遍历班级，绑定班主任姓名 + 计算班级状态
            records.forEach(clazz -> {
                // 绑定班主任姓名
                empList.stream()
                        .filter(emp -> emp.getId().equals(clazz.getMasterId()))
                        .findFirst()
                        .ifPresent(emp -> clazz.setMasterName(emp.getName()));

                // 计算班级状态（基于班级自身的开课、结课日期）
                LocalDate now = LocalDate.now();
                LocalDate beginDate = clazz.getBeginDate();
                LocalDate endDate = clazz.getEndDate();
                String status;

                if (beginDate != null && endDate != null) {
                    if (now.isBefore(beginDate)) {
                        status = "未开课";
                    } else if (now.isAfter(endDate)) {
                        status = "已结课";
                    } else {
                        status = "在读";
                    }
                    clazz.setStatus(status);
                }
            });
        }

        // 7. 封装分页结果返回
        return new PageResult<>(total, records);
    }

    /**
     * 查询回显
     *
     * @param id id
     * @return 查询数据
     */
    @Override
    public Clazz selectById(Integer id) {
        return this.baseMapper.selectById(id);
    }

    /**
     * 修改班级
     *
     * @param clazz 班级信息
     */
    @Override
    public void updateClazz(Clazz clazz) {
        clazz.setUpdateTime(LocalDateTime.now());
        this.updateById(clazz);
    }

    /**
     * 删除班级
     *
     * @param id 班级id
     */
    @Override
    public void delete(Integer id) {
        this.removeById(id);
    }
}
